<?php
//工具类
class ToolsAction extends Action {
	//查手机归属地
	public function checkMobile(){
	   if(isset($_GET['mobile'])) { 
		  $number = $_GET['mobile']; 
		  $url = 'http://cz.115.com/?ct=index&ac=get_mobile_local&mobile='.$number; 
		  $ch = curl_init($url); 
		  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
		  curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ; // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回  
		  $result = curl_exec($ch); 
		  curl_close($ch); 
		  $leng = strlen(trim($result));
		  $data = json_decode(substr($result,1,$leng-2));
		  if($data->queryresult == True){
			  $this->ajaxReturn($data,"查询到的手机归属地信息",1);
		  }else{
		 	  $this->ajaxReturn($result,"获取手机归属地出错",0);
		  }
	   }else{
			$this->display();
	   }
	}
	
	/**
	 * Short description.
	 * @param   type    $varname    description
	 * @return  type    description
	 * @access  public or private
	 * @static  makes the class property accessible without needing an instantiation of the class
	 */
	public function txtToImage()
	{
	    //header ("Content-type: image/png");

		$param = $this->_param();
		mb_internal_encoding("UTF-8"); // 设置编码
//rgb(236, 241, 247)
		
		$text = "    前段时间练习使用 PHP 的 GD 库时，为了文本的自动换行纠结了很久。虽然可以通过插入 \n\n    实现换行，但考虑到文本中既有中文又有英文，强制限定每多少个文字就换行的效果很差。后来终于找到了一个英文下的自动换行的方法，其大概原理是将空格作为分隔符，将字符串分割为一个个单词，然后再一个接一个地拼接在一起，判断其长度是否超过画布，若超过则换行再拼接，否则继续拼接。考虑到中文需要将每个文字都拆开，所以我进行了一点修改，完整代码如下。";
		if($param['title']){
			$text = $param['title']."\n";
		}
		if($param['content']){
			$text .= $param['content'];
		}
		
		//echo __PUBLIC__.'/font/simsun.ttf';
		$result = $this->autowrap(20, 0, "./Public/font/方正黑体简体.TTF", $text, 560); // 自动换行处理
		//dump($result);
		$result['height'] += 400;
		$bg = imagecreatetruecolor(640, $result['height']); // 创建画布
		$bgcolor = imagecolorallocate($bg, 250, 248, 248);
		imagefill($bg,0,0,$bgcolor);
		$white = imagecolorallocate($bg, 51, 51, 51); // 创建字体颜色
		//echo $text;
		// 若文件编码为 GB2312 请将下行的注释去掉
		// $text = iconv("GB2312", "UTF-8", $text);
		imagettftext($bg, 20, 0, 30, 250, $white, "./Public/font/方正黑体简体.TTF", $result['content']);
		$imgfile = 'bg.png';
		imagepng($bg,$imgfile);
		imagedestroy($bg);
		import('ORG.Util.Image');
		$Image = new Image();
		// 给avator.jpg 图片添加logo水印
		$Image->water($imgfile,'qr.png','',100,0);
		$Image->water($imgfile,'qr.png','',100,1);
		$this->ajaxReturn("<img src='http://192.168.1.42/SMS/$imgfile' style='width:300px'/>","http://192.168.1.42/SMS/".$imgfile,1);
	} // end func
	public function autowrap($fontsize, $angle, $fontface, $string, $width) {
		// 这几个变量分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度
		 $content = "";
		 // 将字符串拆分成一个个单字 保存到数组 letter 中
		 for ($i=0;$i<mb_strlen($string);$i++) {
			$letter[] = mb_substr($string, $i, 1);
		 }
		 $line = 0;
		 foreach ($letter as $l) {
			  $teststr = $content." ".$l;
			  $testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);
			  // 判断拼接后的字符串是否超过预设的宽度
			  if (($testbox[2] > $width) && ($content !== "")) {
			      $content .= "\n";
				  $line++;
			  }
			  $content .= ' '.$l;
		 }
	
		 $width = $line * 80;
		 $result = array(
			'height' => $width,
			'content' => $content
		 );
		 //dump($result);
		 return $result;
	}
	//登录地址
	public function login($type = null){
		empty($type) && $this->error('参数错误');

		//加载ThinkOauth类并实例化一个对象
		import("ORG.ThinkSDK.ThinkOauth");
		$sns  = ThinkOauth::getInstance($type);

		//跳转到授权页面
		redirect($sns->getRequestCodeURL());
	}

	//授权回调地址
	public function callback($type = null, $code = null){
		(empty($type) || empty($code)) && $this->error('参数错误');
		
		//加载ThinkOauth类并实例化一个对象
		import("ORG.ThinkSDK.ThinkOauth");
		$sns  = ThinkOauth::getInstance($type);

		//腾讯微博需传递的额外参数
		$extend = null;
		if($type == 'tencent'){
			$extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey'));
		}

		//请妥善保管这里获取到的Token信息，方便以后API调用
		//调用方法，实例化SDK对象的时候直接作为构造函数的第二个参数传入
		//如： $qq = ThinkOauth::getInstance('qq', $token);
		$token = $sns->getAccessToken($code , $extend);

		//获取当前登录用户信息
		if(is_array($token)){
			$user_info = A('Type', 'Event')->$type($token);

			echo("<h1>恭喜！使用 {$type} 用户登录成功</h1><br>");
			echo("授权信息为：<br>");
			dump($token);
			echo("当前登录用户信息为：<br>");
			dump($user_info);
		}
	}
	//二维码生成
    public function qr()
	{
	    import("@.ORG.LogoQRmake");
		$png = new LogoQRmake('http://www.sunguide.cn','./Public/images/logo.png','200x200');
		$png->images();
	} // end func
	//邮件发送
    public function sendMail()
	{
	    import('@.ORG.Mail');
		echo (SendMail('sunguide@qq.com','邮件标题','邮件正文','语音呼叫管理员'));
		
	} // end func
	//短链接生成
    public function url()
	{
	    dump($this->shortUrl("http://www.sunguide.cn"));
		
	} // end func
	//思路：
	//1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
	//2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
	//3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
	//4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
	function shortUrl($url='', $prefix='', $suffix='') {
		$base32 = array (
		'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
		'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
		'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
		'y', 'z', '0', '1', '2', '3', '4', '5');

		$hex = md5($prefix.$url.$suffix);
		$hexLen = strlen($hex);
		$subHexLen = $hexLen / 8;
		$output = array();

		for ($i = 0; $i < $subHexLen; $i++) {
			$subHex = substr ($hex, $i * 8, 8);
			$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
			$out = '';
			for ($j = 0; $j < 6; $j++) {
				$val = 0x0000001F & $int;
				$out .= $base32[$val];
				$int = $int >> 5;
			}
			$output[] = $out;
		}
		return $output;
		
	}
	
	
	//N位短链接生成代码 的测试 
	public function stU()
	{
	    $t = 100;
		$time_start =  microtime(true);
		while($t--){
			$encode = TinyURL::encode(2100000000);
			var_dump( $encode  );
			var_dump( TinyURL::decode($encode) );
		}
		$time_end = microtime(true);
		printf("[内存使用: %.2fMB]\r\n", memory_get_usage() /1024 /1024 ); 
		printf("[内存最高使用: %.2fMB]\r\n", memory_get_peak_usage()  /1024 /1024) ; 
		printf("[执行时间: %.2f毫秒]\r\n", ($time_end - $time_start) * 1000 );
	} // end func
}
/**
 * PHP N位短链接生成代码 
 * @author QPWOEIRU96
 * @date 2012-03-27
 * @site: http://sou.la/blog
 * @description 仅支持20亿以下的数据加解密
 */
Class TinyURL {
    static private $key = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; //可以多位 保证每位的字符在URL里面正常显示即可
    private function  __construct() {}
    private function  __clone(){}
    
    static public function encode($value) {
        $base = strlen( self::$key );
        $arr = array();
        while( $value != 0 ) {
            $arr[] = $value % $base;
            $value = floor( $value / $base );
        }
        $result = "";
        while( isset($arr[0]) ) $result .= substr(self::$key, array_pop($arr), 1 );
        return $result;
    }
    
    static public function decode($value) {
        $base = strlen( self::$key );
        $num = 0;
        $key = array_flip( str_split(self::$key) );
        $arr = str_split($value);
        for($len = count($arr) - 1, $i = 0; $i <= $len; $i++) {
            $num += pow($base, $i) * $key[$arr[$len-$i]];
        }
        return $num;
    }
}